import axios from "axios";
import {Message} from "element-ui";
import router from '../router'

//处理响应信息的拦截器
/*上面已经导入了axios的对象了，这个对象里面有个响应的拦截器axios.interceptors.response.use(),
use里面的data是服务端响应给你的数据，该拦截器有两个回调函数，
一个是success，一个是error,和jQuery里面的ajax一样请求数据的时候也有两个回调函数，一个success，一个error,
可以简单的理解为http的响应码是200的，它会进入到success方法中来，400以上的会进入到error来，
*/
axios.interceptors.response.use(success => {
        /*success.status:http的响应码  success.status==200 success.data.status==500 是返回的json的status
        postman里服务端返回的数据，前者是http返回的状态码
         */
        if (success.status && success.status === 200 && success.data.status === 500) {
            Message.error({message: success.data.msg})
            return;
        }
        if (success.data.msg) {
            Message.success({message: success.data.msg})
        }
        return success.data;
    }, error => {
        if (error.response.status === 504 || error.response.status === 404) {
            Message.error({message: '服务器被吃了，故障正在加急修理中......'})
        } else if (error.response.status === 403) {
            Message.error({message: '权限不足，请联系管理员'})
        } else if (error.response.status === 401) {
            Message.error({message: '尚未登录，请先登录'})
            router.replace('/');
        } else {
            //服务端返回的数据,json类型的数据
            if (error.response.data.msg) {
                Message.error({message: error.response.data.msg})
            } else {
                Message.error({message: '未知错误'})
            }
        }
        //错误了就不必返回给前端实体类数据
        return;
    }
)
//请求封装，可以给请求添加前缀
let base = '';
//url:请求的地址，param:请求的参数  springSecurity请求接收参数默认的是key:value的形式
export const postKeyValueRequest = (url, params) => {

    //封装前端返回的数据
    return axios({
        method: 'post',
        url: `${base}${url}`,
        data: params,  //直接这样会以json的形式传给服务器，这是不支持的
        transformRequest: [function (data) {
            let ret = '';
            for (let i in data) {
                //在ret上追加变量,以&隔开,前者为key,后者为value
                ret += encodeURIComponent(i) + '=' + encodeURIComponent(data[i]) + '&'
            }
            console.log(ret);
            return ret;
        }],
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded '
        }
    })

}
export const postRequest = (url, params) => {
    return axios({
        method: 'post',
        url: `${base}${url}`,
        data: params
    })
}

export const putRequest = (url, params) => {
    return axios({
        method: 'put',
        url: `${base}${url}`,
        data: params
    })
}
export const getRequest = (url, params) => {
    return axios({
        method: 'get',
        url: `${base}${url}`,
        data: params
    })
}

export const deleteRequest = (url, params) => {
    return axios({
        method: 'delete',
        url: `${base}${url}`,
        data: params
    })
}